/**
 * 提供 mapbox gl 尺寸标记使用
 */

/**
 * 生成尺寸梯度
 * @param min 最小值
 * @param max 最大值
 * @param minSize 最小尺寸
 * @param maxSize 最大尺寸
 * @param step 步长
 * @param attribute 属性
 * @returns 尺寸梯度 [1, 15, 2, 20, 3, 25 ...]
 */
function generateSizeGradient(
  min: number,
  max: number,
  minSize: number,
  maxSize: number,
  step: number,
  attribute: string
) {
  const sizeGradient: any = ['interpolate', ['linear'], ['get', attribute]]
  // 最大值和最小值相等
  if (min === max) {
    sizeGradient.push(min)
    sizeGradient.push(minSize)
  } else {
    const averageValue: number = (max - min) / (step - 1)
    const averageSize: number = (maxSize - minSize) / (step - 1)
    for (let i = 0; i < step; i += 1) {
      const stepValue: number = Math.floor((min + i * averageValue) * 100) / 100
      const stepSize: number =
        Math.floor((minSize + i * averageSize) * 100) / 100
      sizeGradient.push(stepValue)
      sizeGradient.push(i < step - 1 ? stepSize : maxSize)
    }
  }
  return sizeGradient
}

export default generateSizeGradient
